#include <cstring>
#include <cstdlib>

#include "common/error.hpp"

Error::Error(const Error& other)
{
    if (other.mesg)
    {
        mesg = (char*)malloc(strlen(other.mesg) + 1);
        strcpy(const_cast<char*>(mesg), other.mesg);
    }
    err = other.err;
}

bool Error::is_a(ErrorInfo const* to_find) const
{
    const ErrorInfo* e = err;
    while(e)
    {
        if (e == to_find) return true;
        e = e->isa;
    }
    return false;
}

Error& Error::operator = (const Error& other)
{
    if (mesg)
    {
        free(const_cast<char*>(mesg));
    }
    if (other.mesg)
    {
        unsigned int len = strlen(other.mesg) + 1;
        mesg = (char*)malloc(len);
        memcpy(const_cast<char*>(mesg), other.mesg, len);
    }
    err = other.err;
    return *this;
}

Error::~Error()
{
    if (mesg)
        free(const_cast<char*>(mesg));
}
